package com.base.lock.redis.shouer;

/**
 * 获取锁管理类
 */
public interface DistributedLocker {

    /**
     * 锁 <br>
     * @param key  锁的名称
     * @param worker 获取锁后的处理类
     * @param <T>
     * @return 处理完具体的业务逻辑要返回的数据
     */
    <T> T tryLock(String key, AquiredLockWorker<T> worker) ;

    /**
     * 锁
     * @param <T>
     * @param key
     * @param worker
     * @param waitTime 最长获取锁的等待时间 单位秒
     * @return
     */
    <T> T tryLock(String key, AquiredLockWorker<T> worker, int waitTime);
    
    /**
     * 获取锁 <br>
     * @param key
     * @return
     */
    boolean tryLock(String key);
    
    /**
     * 获取锁
     * @param key 
     * @param waitTime 最长获取锁的等待时间  单位秒
     * @return
     */
    boolean tryLock(String key,int waitTime);
    
    /**
     * 获取锁<br>
     * 注意：获取不到锁，永久等待
     * @param key
     * @return
     */
    void lock(String key);
    
    
    /**
     * 释放锁
     * @param key
     * @return
     */
    void unLock(String key);
}